目前的检测算法主要思路还是设置大量anchor+分配正负样本+训练的一个思路,Anchor的本质是目标的候选框,因为目标的形状和位置的多种可能性,Anchor的数量往往非常庞大,否则会出现遗漏的情况,这种情况对于one-stage的检测算法更加突出。本文不使用anchor boxes,而是提出了一种叫做corner pooling的操作帮助网络更好地定位目标。
首先,说下Anchor的两个缺点:
- 通常需要大量的anchor,在SSD中需要40k,而在RetinaNet中则需要100k。大量的anchor中只有少部分和gt的重合比较大,可以作为正样本训练,其它都是负样本,这样就带来了正负例anchor的比例不均衡,也降低了网络的训练速度。
- anchor boxes的引入带来了许多的超参数,并且需要进行细致设计。包括anchor boxes的数量、尺寸、长宽比例。特别是在单一网络在多尺度进行预测的情况下会变得复杂,每个尺度都需要独立设计。
正是有这两个缺点,受到keypoint问题的启发,作者就想到用关键点检测的思路来处理detection问题,只要找到top-left和Bottom-right两个点,就可以准确框出一个目标了。使用单一卷积模型生成热点图和embedding vector:所有目标的左上角和所有目标的右下角热点图heatmap(两个heatmap),每个顶点的embedding vector。也就是该方法在卷积的输出结果上,分别预测边界框的左上角与右下角,之后寻找它们之间的对应关系。
主要思路其实来源于一篇多人姿态估计的论文。基于CNN的2D多人姿态估计方法,通常有2个思路(Bottom-Up Approaches和Top-Down Approaches):
- Top-Down framework:就是先进行行人检测,得到边界框,然后在每一个边界框中检测人体关键点,连接成每个人的姿态,缺点是受人体检测框影响较大,代表算法有RMPE(alphapose);
- Bottom-Up framework:就是先对整个图片进行每个人体关键点部件的检测,再将检测到的人体部位拼接成每个人的姿态,代表方法就是openpose。
文章有两大创新点:
文章将目标检测上升到方法论,基于多人姿态估计的Bottom-Up思想,首先同时预测定位框的顶点对(左上角和右下角)热点图和一个分支输出embedding vector,然后找出那些最有可能是top-left和bottom-right的点,并根据embedding vector对顶点进行分组(论文中提到分组的依据是同目标的两个角点距离很小),因此embedding vector是用来帮助判断top-left与bottom-right之间的匹配关系。
文章提出了corner pooling用于定位顶点,因为检测任务的变化,传统的Pooling方法并不是非常适用该网络框架。自然界的大部分目标是没有边界框也不会有矩形的顶点,以top-left corner pooling 为例,对每个channel,分别提取特征图对应位置处的水平和垂直方向的最大值,然后求和。
为什么基于角点的检测要比基于anchor boxes的检测效果更好,这里假设了两个原因:
- anchor boxes的中心点难以确定,是依赖于目标的四条边的,但是顶点却只需要目标框的两个边,所以角点更容易提取,而且还是使用了corner pooling,因而表现比anchor好。
- 采用了更加高效的空间检测框机制,顶点可以更有效地提取离散的边界空间,这里只使用$O(w∗h)$个角点就代表了$O(w^2∗h^2)$的可能检测框anchor box。
Overview
模型整体是首先通过1个7×7的卷积层将输入图像尺寸缩小为原来的1/4(论文中输入图像大小是511×511,缩小后得到128×128大小的输出)。然后经过特征提取网络(backbone network)提取特征,该网络采用hourglass network,该网络通过串联多个hourglass module组成(这里是2个),每个hourglass module都是先通过一系列的降采样操作缩小输入的大小,然后通过上采样恢复到输入图像大小,因此该部分的输出特征图大小还是128×128,整个hourglass network的深度是104层。